//
// Copyright (c) 2024 BPer
//
#ifndef BPERWEBRTC_BPERRTCPUBLISHSTREAM_H_
#define BPERWEBRTC_BPERRTCPUBLISHSTREAM_H_

#include <bperrtc/BPerRtcStream.h>
#include <bperrtc/BPerRtcContext.h>

#include <bperrtp/BPerRtcpXr.h>
#include <bperrtp/BPerRtcpRR.h>
#include <bperrtp/BPerRtcpXr.h>
#include <bperrtp/BPerRtcpNack.h>
#include <bperrtp/BPerRtpPacket.h>
#include <bperrtp/BPerRtcpPsfbCommon.h>
#include <bperrtp/BPerPublishNackBuffer.h>

#include <bperutil/buffer/BPerBuffer.h>

typedef struct{
	BPerRtcPushStream *pubStream;
	int32_t (*on_recv_nack)(BPerRtcContext* context,BPerRtcPushStream* pub,BPerPublishNackBuffer *que,BPerRtcpNack* nack);
	int32_t (*cache_nack)(BPerRtcPushStream* pub,BPerRtpPacket *pkt,char* p,int plen);
	int32_t (*send_rtcp_sr)(BPerRtcContext *context, BPerRtcPushStream* pub);
	int32_t (*on_rtcp_nack)(BPerRtcContext* context,BPerRtcPushStream* pub,BPerRtcpCommon *rtcp);
	int32_t (*on_rtcp_xr)(BPerRtcContext* context,BPerRtcPushStream* pub,BPerRtcpCommon *rtcp) ;
	int32_t (*on_rtcp_rr)(BPerRtcContext* context,BPerRtcPushStream* pub,BPerRtcpCommon *rtcp);
	int32_t (*on_rtcp)(BPerRtcContext* context,BPerRtcPushStream* pub,BPerRtcpCommon *rtcp);
	int32_t (*on_rtcp_ps_feedback)(BPerRtcContext* context,BPerRtcPushStream* pub,BPerRtcpCommon *rtcp) ;
	int32_t (*check_twcc)(BPerRtcContext* context,BPerRtcPushStream* pub);
	int32_t (*check_bandwidth)(BPerRtcContext* context,BPerRtcPushStream* pub);

}BPerRtcPush;

void bPer_create_rtcpush(BPerRtcPush* pub,uint32_t audioSsrc, uint32_t videoSsrc);
void bPer_destroy_rtcpush(BPerRtcPush* pub);

#endif /* BPERWEBRTC_BPERRTCPUBLISHSTREAM_H_ */
